﻿using Mosaik.Core;
using System.Collections.Concurrent;
using System.Collections.Generic;

namespace Catalyst
{
    public static partial class StopWords
    {
        public static partial class Snowball
        {
            // Default stop words from Lucene: https://github.com/apache/lucene-solr/tree/master/lucene/analysis/common/src/resources/org/apache/lucene/analysis/snowball
            // The same license applies to the other partial instances of the class StopWords.Snowball

            //   Copyright (c) 2001, Dr Martin Porter
            //   Copyright (c) 2002, Richard Boulton
            //   All rights reserved.

            //   Redistribution and use in source and binary forms, with or without
            //   modification, are permitted provided that the following conditions are met:

            //       * Redistributions of source code must retain the above copyright notice,
            //       * this list of conditions and the following disclaimer.
            //       * Redistributions in binary form must reproduce the above copyright
            //       * notice, this list of conditions and the following disclaimer in the
            //       * documentation and/or other materials provided with the distribution.
            //       * Neither the name of the copyright holders nor the names of its contributors
            //       * may be used to endorse or promote products derived from this software
            //       * without specific prior written permission.

            //   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
            //   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
            //   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
            //   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
            //   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
            //   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
            //   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
            //   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
            //   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
            //   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


            private static ReadOnlyHashSet<string> Empty = new ReadOnlyHashSet<string>(new HashSet<string>());

            private static ConcurrentDictionary<Language, ReadOnlyHashSet<string>> _perLanguage = new ConcurrentDictionary<Language, ReadOnlyHashSet<string>>();
            public static void Register(Language language, ReadOnlyHashSet<string> stopWords) => _perLanguage[language] = stopWords;
            public static ReadOnlyHashSet<string> For(Language lang) => _perLanguage.TryGetValue(lang, out var set) ? set : Empty;

        }
    }
}